/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package DTD.Validador;

import DTD.Diccionario.Diccionario;
import Utilidades.AtributoEtiqueta;
import Utilidades.StrOp;
import java.util.ArrayList;

/**
 *
 * @author Administrador
 */
public class ValidadorAttList {
    private Diccionario diccionario;
    private String[] reglas;

    public ValidadorAttList(final String dtdReglas) {
        diccionario = new Diccionario();
        reglas = this.getDefiniciones(dtdReglas);
    }

    public boolean validar(final AtributoEtiqueta[] atributos) {
        boolean resultado = true;

        for (int i = 0; i < reglas.length && resultado; i++) {
            String regla = reglas[i];
            resultado = validarRegla(regla, atributos);
        }
        return resultado;
    }

    private String[] getDefiniciones(String dtdReglas) {
        ArrayList<String> resultado = new ArrayList<String>();
        String[] lista = StrOp.separar(dtdReglas, " ", "<!ATTLIST", ">", '(', ')');
        int j = 0;
        String agregar = "";

        for (int i = 1; i < lista.length; i++) {
            String aux = lista[i];
            if (j == 3) {
                if (diccionario.existe(aux)) {
                    agregar = agregar + aux + " ";
                }
                else {
                    i--;
                }
                resultado.add(agregar.trim());
                agregar = "";
                j = 0;
            }
            else {
                agregar = agregar + aux + " ";
                j++;
            }
        }
        if (agregar.equals("") == false) {
            resultado.add(agregar.trim());
        }
        return resultado.toArray(new String[resultado.size()]);
    }

    private boolean validarCardinalidad(int n, String regla) {
        boolean resultado = false;

        try {
            String[] aux = regla.split(" ");
            String cardinalidad = aux[aux.length - 1];

            if (cardinalidad.equals("#REQUIRED") == true) {
                resultado = (n == 1);
            }
            else if (cardinalidad.equals("#IMPLIED") == true) {
                resultado = (n >= 0);
            }
        } catch (ArrayIndexOutOfBoundsException e) {
            resultado = false;
        }
        return resultado;
    }

    private boolean validarRegla(String regla, AtributoEtiqueta[] atributos) {
        int cantidadValidaciones = 0;
        ValidadorAtributo vAtributo = new ValidadorAtributo();
        String nombreRegla = regla.split(" ")[0];

        for (int i = 0; i < atributos.length; i++) {
            AtributoEtiqueta variable = atributos[i];
            if (nombreRegla.equals(variable.getNombre()) == true && vAtributo.validar(regla, variable) == true) {
                cantidadValidaciones++;
            }
        }
        return validarCardinalidad(cantidadValidaciones, regla);
    }

}
